<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>设计模式 | Dirac Lee</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp" />
<meta name="Description" content="GoF 23 种设计模式"><link rel="prev" href="https://diraclee.gitee.io/2020/06/cs229_lecture1/" /><link rel="next" href="https://diraclee.gitee.io/2020/07/cs229_lecture2/" /><link rel="canonical" href="https://diraclee.gitee.io/2020/07/design_pattern/" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff"><meta property="og:title" content="设计模式" />
<meta property="og:description" content="GoF 23 种设计模式" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://diraclee.gitee.io/2020/07/design_pattern/" />
<meta property="article:published_time" content="2020-07-18T00:00:00+00:00" />
<meta property="article:modified_time" content="2020-07-19T00:00:00+00:00" />
<script type="application/ld+json">
    {
        "@context": "http://schema.org",
        "@type": "BlogPosting",
        "headline": "设计模式",
        "mainEntityOfPage": {
            "@type": "WebPage",
            "@id": "https:\/\/diraclee.gitee.io\/2020\/07\/design_pattern\/"
        },"image": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  800 ,
                "height":  600 
            },"genre": "posts","keywords": "设计模式","wordcount":  3261 ,
        "url": "https:\/\/diraclee.gitee.io\/2020\/07\/design_pattern\/","datePublished": "2020-07-18T00:00:00\x2b00:00","dateModified": "2020-07-19T00:00:00\x2b00:00","license": "This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.","publisher": {
                "@type": "Organization",
                "name": "xxxx",
                "logo": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  127 ,
                "height":  40 
                }
            },"description": "GoF 23 种设计模式"
    }
    </script><link rel="stylesheet" href="/css/style.min.css"><link rel="stylesheet" href="/css/lib/fontawesome-free/all.min.css"><link rel="stylesheet" href="/css/lib/animate/animate.min.css"></head>
    <body><script>
            window.isDark = (window.localStorage && window.localStorage.getItem('theme')) === 'dark';
            window.isDark && document.body.classList.add('dark-theme');
        </script><div class="wrapper"><nav class="navbar">
    <div class="navbar-container">
        <div class="navbar-header animated bounceIn">
            <a href="https://diraclee.gitee.io">Dirac Lee</a>
        </div>
        <div class="navbar-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"><i class="fas fa-language fa-fw"></i></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><nav class="navbar-mobile">
    <div class="navbar-container">
        <div class="navbar-header">
            <div class="navbar-header-title animated bounceIn">
                <a href="https://diraclee.gitee.io">Dirac Lee</a>
            </div>
            <div class="menu-toggle" id="menu-toggle">
                <span></span><span></span><span></span>
            </div>
        </div>
        <div class="navbar-menu" id="mobile-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><main class="main">
                <div class="container"><article class="page"><h1 class="post-title animated flipInX">设计模式</h1><div class="post-meta">
            <div class="post-meta-main"><a class="author" href="https://diraclee.gitee.io" rel="author" target="_blank">
                    <i class="fas fa-user-circle fa-fw"></i>Dirac Lee
                </a>&nbsp;<span class="post-category">收录于&nbsp;<i class="far fa-folder fa-fw"></i><a href="https://diraclee.gitee.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>&nbsp;</span></div>
            <div class="post-meta-other"><i class="far fa-calendar-alt fa-fw"></i><time datetime=2020-07-18>2020-07-18</time>&nbsp;
                <i class="fas fa-pencil-alt fa-fw"></i>约 3261 字&nbsp;
                <i class="far fa-clock fa-fw"></i>预计阅读 7 分钟&nbsp;</div>
        </div><div class="post-content"><a class="post-dummy-target" id="一设计模式简介"></a><h2>一、设计模式简介</h2>
<a class="post-dummy-target" id="1设计模式作用"></a><h3>1、设计模式作用</h3>
<p>避免重复造轮子，可复用面向对象</p>
<a class="post-dummy-target" id="2底层思维与抽象思维"></a><h3>2、底层思维与抽象思维</h3>
<p>底层思维：把握底层微观构造</p>
<ul>
<li>语言构造</li>
<li>编译转换</li>
<li>内存模型</li>
<li>运行时机制</li>
</ul>
<p>抽象思维：将现实世界抽象为程序代码</p>
<ul>
<li>面向对象</li>
<li>组件封装</li>
<li>设计模式</li>
<li>架构模式</li>
</ul>
<a class="post-dummy-target" id="3深入理解面向对象"></a><h3>3、深入理解面向对象</h3>
<ul>
<li>
<p>向下：深入理解三大面向对象机制</p>
<ul>
<li>封装：隐藏内部实现</li>
<li>继承：复用现有代码</li>
<li>多态：改写对象行为</li>
</ul>
</li>
<li>
<p>向下：深刻把握面向对象机制带来的抽象意义，理解如何使用这些机制来表达现实世界，掌握什么是“好的面向对象设计”</p>
</li>
</ul>
<a class="post-dummy-target" id="4软件设计固有的复杂性变化"></a><h3>4、软件设计固有的复杂性——变化</h3>
<ul>
<li>客户需求</li>
<li>技术平台</li>
<li>开发团队</li>
<li>市场环境</li>
</ul>
<a class="post-dummy-target" id="5如何解决复杂性"></a><h3>5、如何解决复杂性</h3>
<ul>
<li>分解：分而治之，大事化小，小事化了</li>
<li>抽象：由于不能掌握全部的复杂对象，我们选择忽视它的非本质细节，而去处理泛化的和理想化的对象模型</li>
</ul>
<a class="post-dummy-target" id="二面向对象设计原则"></a><h2>二、面向对象设计原则</h2>
<blockquote>
<p>变化是复用的天敌，面向对象设计的最大优势在于抵御变化。</p>
</blockquote>
<a class="post-dummy-target" id="一依赖倒置原则dip"></a><h3>一、依赖倒置原则（DIP）</h3>
<ul>
<li>高层模块(稳定)不应该依赖于低层模块(变化)，二者都应该依赖于抽象(稳定) 。</li>
<li>抽象(稳定)不应该依赖于实现细节(变化) ，实现细节应该依赖于抽象(稳定)。</li>
</ul>
<a class="post-dummy-target" id="二开放封闭原则ocp"></a><h3>二、开放封闭原则（OCP）</h3>
<ul>
<li>对扩展开放，对更改封闭。</li>
<li>类模块应该是可扩展的，但是不可修改。</li>
</ul>
<a class="post-dummy-target" id="三单一职责原则srp"></a><h3>三、单一职责原则（SRP）</h3>
<ul>
<li>
<p>一个类应该仅有一个引起它变化的原因。</p>
</li>
<li>
<p>变化的方向隐含着类的责任。</p>
</li>
</ul>
<a class="post-dummy-target" id="四liskov替换原则lsp"></a><h3>四、Liskov替换原则（LSP）</h3>
<ul>
<li>子类必须能够替换它们的基类(IS-A)。</li>
<li>继承表达类型抽象。</li>
</ul>
<a class="post-dummy-target" id="五接口隔离原则isp"></a><h3>五、接口隔离原则（ISP）</h3>
<ul>
<li>不应该强迫客户程序依赖它们不用的方法。</li>
<li>接口应该小而完备。</li>
</ul>
<a class="post-dummy-target" id="六对象组合优先于类继承原则"></a><h3>六、对象组合优先于类继承原则</h3>
<ul>
<li>类继承通常为“白箱复用”，对象组合通常为“黑箱复用”。</li>
<li>继承在某种程度上破坏了封装性，子类父类耦合度高。</li>
<li>而对象组合则只要求被组合的对象具有良好定义的接口，耦合度低。</li>
</ul>
<a class="post-dummy-target" id="七隔离变化原则"></a><h3>七、隔离变化原则</h3>
<ul>
<li>使用封装来创建对象之间的分界层，让设计者可以在分界层的一侧进行修改，而不会对另一侧产生不良的影响，从而实现层次间的松耦合。</li>
</ul>
<a class="post-dummy-target" id="八针对接口编程原则"></a><h3>八、针对接口编程原则</h3>
<ul>
<li>不将变量类型声明为某个特定的具体类，而是声明为某个接口。</li>
<li>客户程序无需获知对象的具体类型，只需要知道对象所具有的接口。</li>
<li>减少系统中各部分的依赖关系，从而实现“高内聚、松耦合”的类型设计方案。</li>
</ul>
<a class="post-dummy-target" id="三23种设计模式详述"></a><h2>三、23种设计模式详述</h2>
<a class="post-dummy-target" id="1模板方法模式--template-method-"></a><h3>1、模板方法模式 ( Template Method )</h3>
<blockquote>
<p>定义一个操作中的算法的骨架(稳定)，而将一些步骤延迟(变化)到子类中。Template Method使得子类可以复用一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200718155958.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="2策略模式--strategy-"></a><h3>2、策略模式 ( Strategy )</h3>
<blockquote>
<p>定义一系列算法，把它们一个个封装起来，并且使它们可互相替换（变化）。该模式使得算法可独立于使用它的客户程序(稳定)而变化（扩展，子类化）。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200718174414.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="3观察者模式--observer-"></a><h3>3、观察者模式 ( Observer )</h3>
<blockquote>
<p>定义对象间的一种一对多（变化）的依赖关系，以便当一个对象(Subject)的状态发生改变时，所有依赖于它的对象都得到通知并自动更新。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200718173647.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="4装饰器模式--decorator-"></a><h3>4、装饰器模式 ( Decorator )</h3>
<blockquote>
<p>动态（组合）地给一个对象增加一些额外的职责。就增加功能而言，Decorator模式比生成子类（继承）更为灵活（消除重复代码&amp; 减少子类个数）。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200719174153.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="5桥模式--bridge-"></a><h3>5、桥模式 ( Bridge )</h3>
<blockquote>
<p>将抽象部分(业务功能)与实现部分(平台实现)分离，使它们都可以独立地变化。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200719181732.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="6工厂方法模式--factory-method-"></a><h3>6、工厂方法模式 ( Factory Method )</h3>
<blockquote>
<p>定义一个用于创建对象的接口，让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟（目的：解耦，手段：虚函数）到子类。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200720165730.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="7抽象工厂模式--abstract-factory-"></a><h3>7、抽象工厂模式 ( Abstract Factory )</h3>
<blockquote>
<p>提供一个接口，让该接口负责创建一系列“相关或者相互依赖的对象”，无需指定它们具体的类。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200720175109.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="8原型模式--prototype-"></a><h3>8、原型模式 ( Prototype )</h3>
<blockquote>
<p>使用原型实例指定创建对象的种类，然后通过拷贝这些原型来创建新的对象。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200730155008.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="9构建器模式--builder-"></a><h3>9、构建器模式 ( Builder )</h3>
<blockquote>
<p>将一个复杂对象的构建与其表示相分离，使得同样的构建过程(稳定)可以创建不同的表示(变化)。</p>
<p>——《设计模式》GoF</p>
</blockquote>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20200730160850.png" alt="" class="lazyload"></figure></p>
<a class="post-dummy-target" id="10单例模式--singleton-"></a><h3>10、单例模式 ( Singleton )</h3>
<blockquote>
<p>保证一个类仅有一个实例，并提供一个该实例的全局访问点。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="11享元模式--flyweight-"></a><h3>11、享元模式 ( Flyweight )</h3>
<blockquote>
<p>运用共享技术有效地支持大量细粒度的对象</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="12门面模式--facade-"></a><h3>12、门面模式 ( Facade )</h3>
<blockquote>
<p>为子系统中的一组接口提供一个一致（稳定）的界面， Facade模式定义了一个高层接口，这个接口使得这一子系统更加容易使用（复用）。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="13代理模式--proxy-"></a><h3>13、代理模式 ( Proxy )</h3>
<blockquote>
<p>为其他对象提供一种代理以控制（隔离，使用接口）对这个对象的访问。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="14适配器模式--adapter-"></a><h3>14、适配器模式 ( Adapter )</h3>
<blockquote>
<p>将一个类的接口转换成客户端希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="15中介者模式--mediator-"></a><h3>15、中介者模式 ( Mediator )</h3>
<blockquote>
<p>用一个中介对象来封装（封装变化）一系列的对象交互。中介者使各对象不需要显式的相互引用（编译时依赖→运行时依赖），从而使其耦合松散（管理变化），而且可以独立地改变它们之间的交互。</p>
<p>——《设计模式》GOF</p>
</blockquote>
<a class="post-dummy-target" id="16状态模式--state-"></a><h3>16、状态模式 ( State )</h3>
<blockquote>
<p>允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。</p>
<p>——《设计模式》 GOF</p>
</blockquote>
<a class="post-dummy-target" id="17备忘录模式--mementor-"></a><h3>17、备忘录模式 ( Mementor )</h3>
<blockquote>
<p>在不破坏封装性的前提下，捕获一个对象的內部状态，并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。</p>
<p>——《设计模式》GOF</p>
</blockquote>
<a class="post-dummy-target" id="18组合模式--composite-"></a><h3>18、组合模式 ( Composite )</h3>
<blockquote>
<p>将对象组合成树形结构以表示“部分整体”的层次结构。
Composite使得用户对单个对象和组合对象的使用具有一致性（稳定）。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="19迭代器模式--iterator-"></a><h3>19、迭代器模式 ( Iterator )</h3>
<blockquote>
<p>提供一种方法顺序访问一个聚合对象中的各个元素，而又不暴露（稳定）该对象的内部表示。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="20职责链模式--chain-of-responsibility-"></a><h3>20、职责链模式 ( Chain of Responsibility )</h3>
<blockquote>
<p>使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递请求，直到有一个对象处理它为止。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="21命令模式--command-"></a><h3>21、命令模式 ( Command )</h3>
<blockquote>
<p>将一个请求行为）封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤销的操作。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="22访问器模式--visitor-"></a><h3>22、访问器模式 ( Visitor )</h3>
<blockquote>
<p>表示一个作用于某对象结构中的各元素的操作。使得可以在不改变（稳定）各元素的类的前提下定义（扩展）作用于这些元素的新操作（变化）。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="23解析器模式--interpreter-"></a><h3>23、解析器模式 ( Interpreter )</h3>
<blockquote>
<p>给定一个语言，定义它的文法的一种表示，并定义一种解释器，这个解释器使用该表示来解释语言中的句子。</p>
<p>——《设计模式》 GoF</p>
</blockquote>
<a class="post-dummy-target" id="四设计模式回顾"></a><h2>四、设计模式回顾</h2>
<a class="post-dummy-target" id="1一个目标"></a><h3>1、一个目标</h3>
<p>管理变化，提高复用</p>
<a class="post-dummy-target" id="2两种手段"></a><h3>2、两种手段</h3>
<p>分解 v.s. 抽象</p>
<a class="post-dummy-target" id="3八大原则"></a><h3>3、八大原则</h3>
<ul>
<li>依赖倒置原则（DIP）</li>
<li>开放封闭原则（OCP）</li>
<li>单一职责原则（SRP）</li>
<li>Liskov替换原则（LSP）</li>
<li>接口隔离原则（ISP）</li>
<li>对象组合由于类继承</li>
<li>封装变化点</li>
<li>面向接口编程</li>
</ul>
<a class="post-dummy-target" id="4重构技法"></a><h3>4、重构技法</h3>
<ul>
<li>静态 -&gt; 动态</li>
<li>早绑定 -&gt; 晚绑定</li>
<li>继承 -&gt; 组合</li>
<li>编译时依赖 -&gt; 运行时依赖</li>
<li>紧耦合 -&gt; 松耦合</li>
</ul>
<a class="post-dummy-target" id="5从封装变化的角度对设计模式分类"></a><h3>5、从封装变化的角度对设计模式分类</h3>
<ul>
<li>
<p>组件协作</p>
<ul>
<li>Template Method</li>
<li>Strategy</li>
<li>Observer</li>
</ul>
</li>
<li>
<p>单一职责</p>
<ul>
<li>Decorator</li>
<li>Bridge</li>
</ul>
</li>
<li>
<p>对象创建</p>
<ul>
<li>Factory Method</li>
<li>Abstract Method</li>
<li>Prototype</li>
<li>Builder          不常用</li>
</ul>
</li>
<li>
<p>对象性能</p>
<ul>
<li>Singleton</li>
<li>Flyweight</li>
</ul>
</li>
<li>
<p>接口隔离</p>
<ul>
<li>Facade</li>
<li>Proxy</li>
<li>Mediator     不常用</li>
<li>Adapter</li>
</ul>
</li>
<li>
<p>状态变化</p>
<ul>
<li>Memento    被序列化技术替代</li>
<li>State</li>
</ul>
</li>
<li>
<p>数据结构</p>
<ul>
<li>Composite</li>
<li>Iterator       被C++泛型编程替代</li>
<li>Chain of Responsibility     就是单链表数据结构</li>
</ul>
</li>
<li>
<p>行为变化</p>
<ul>
<li>Command        被C++仿函数替代</li>
<li>Visitor         条件苛刻，要慎重</li>
</ul>
</li>
<li>
<p>领域问题</p>
<ul>
<li>Interpreter       一般使用开源工具</li>
</ul>
</li>
</ul>
<a class="post-dummy-target" id="6关注稳定点与变化点"></a><h3>6、关注稳定点与变化点</h3>
<a class="post-dummy-target" id="7什么时候不用模式"></a><h3>7、什么时候不用模式</h3>
<ul>
<li>代码可读性很差时，先把可读性解决再考虑使用模式</li>
<li>需求理解还很浅时，写出能实现需求的代码后再考虑重构</li>
<li>变化没有显现时，预测变化不如顺应变化</li>
<li>不是系统关键依赖点时，把时间精力放在更重要的地方</li>
<li>项目没有复用价值时，没有变化就没必要使用模式</li>
<li>项目将要发布时，正确性远大于拓展性</li>
</ul>
<a class="post-dummy-target" id="8经验之谈"></a><h3>8、经验之谈</h3>
<ul>
<li>不要为模式而模式</li>
<li>关注抽象类&amp;接口</li>
<li>理清变化点与稳定点</li>
<li>审视依赖关系</li>
<li>要有Framework和Application的区隔思维</li>
<li>良好的设计是演化的结果</li>
</ul>
<a class="post-dummy-target" id="9设计模式成长之路"></a><h3>9、设计模式成长之路</h3>
<ul>
<li>“手中无剑，心中无剑”：见模式而不知</li>
<li>“手中有剑，心中无剑“：可以识别模式，作为应用开发人员使用模式</li>
<li>”手中有剑，心中有剑“：作为框架开发人员为应用设计某些模式</li>
<li>“手中无剑，心中有剑”：忘掉模式，只有原则</li>
</ul></div><div class="post-footer" id="post-footer">
    <div class="post-info">
        <div class="post-info-line">
            <div class="post-info-mod">
                <span>本文于 2020-07-19 更新</span>
            </div>
            <div class="post-info-license"></div>
        </div>
        <div class="post-info-line">
            <div class="post-info-md"></div>
            <div class="post-info-share"><span><a href="//www.linkedin.com/shareArticle?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f07%2fdesign_pattern%2f&amp;title=%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f" target="_blank" title="分享到 LinkedIn">
            <i class="fab fa-linkedin fa-fw"></i>
        </a><a href="//service.weibo.com/share/share.php?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f07%2fdesign_pattern%2f&amp;appkey=&amp;title=%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f" target="_blank" title="分享到 Weibo">
            <i class="fab fa-weibo fa-fw"></i>
        </a></span></div>
        </div>
    </div>

    <div class="post-info-more">
        <section><span class="tag">
                        <a href="https://diraclee.gitee.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"><i class="fas fa-tag fa-fw"></i>&nbsp;设计模式</a>&nbsp;
                    </span></section>
        <section>
            <span><a href="javascript:window.history.back();">返回</a></span>&nbsp;|&nbsp;<span><a href="https://diraclee.gitee.io">主页</a></span>
        </section>
    </div>

    <div class="post-nav"><a href="https://diraclee.gitee.io/2020/06/cs229_lecture1/" class="prev" rel="prev" title="cs229 第一节"><i class="fas fa-angle-left fa-fw"></i>cs229 第一节</a>
            <a href="https://diraclee.gitee.io/2020/07/cs229_lecture2/" class="next" rel="next" title="cs229 第二节 ( TA )">cs229 第二节 ( TA )<i class="fas fa-angle-right fa-fw"></i></a></div>
</div><div class="post-comment"></div>
    </article></div>
            </main><footer class="footer">
    <div class="copyright"><div class="copyright-line">由 <a href="https://gohugo.io/" target="_blank" rel="external nofollow noopener noreffer">Hugo</a> 强力驱动 | 主题 - <a href="https://github.com/dillonzq/LoveIt" target="_blank" rel="external nofollow noopener noreffer">LoveIt<i class="far fa-heart fa-fw"></i></a>
        </div>

        <div class="copyright-line"><i class="far fa-copyright fa-fw"></i><span itemprop="copyrightYear">2020</span><span class="author" itemprop="copyrightHolder">&nbsp;<a href="https://diraclee.gitee.io" target="_blank">Dirac Lee</a></span>&nbsp;|&nbsp;<span class="license"><a rel="license external nofollow noopener noreffer" href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank">CC BY-NC 4.0</a></span></div>
    </div>
</footer></div><a href="#" class="dynamic-to-top" id="dynamic-to-top" data-scroll>
            <span>&nbsp;</span>
        </a><script src="/js/lib/jquery/jquery.slim.min.js"></script><script src="/js/lib/lazysizes/lazysizes.min.js"></script><script src="/js/lib/smooth-scroll/smooth-scroll.polyfills.min.js"></script><script>window.scroll = new SmoothScroll('[data-scroll]', {speed: 300, speedAsDuration: true});</script><link rel="stylesheet" href="/css/lib/katex/katex.min.css"><script src="/js/lib/katex/katex.min.js"></script><script defer src="/js/lib/katex/auto-render.min.js"></script><link rel="stylesheet" href="/css/lib/katex/copy-tex.min.css"><script defer src="/js/lib/katex/copy-tex.min.js"></script><script defer src="/js/lib/katex/mhchem.min.js"></script><script>
        document.addEventListener("DOMContentLoaded", function () {
            renderMathInElement(document.body, {
                delimiters: [
                    { left: "$$", right: "$$", display: true },
                    { left: "\\(", right: "\\)", display: false },
                    { left: "\\[", right: "\\]", display: true },{ left: "$", right: "$", display: false },]
            });
        });
    </script><script src="/js/blog.min.js"></script></body>
</html>